package business;

import java.awt.Color;
import java.util.ArrayList;

import persistence.db.DataSet;
import persistence.model.AbstractModel;
import persistence.model.Matiere;
import persistence.model.SEE;
import utility.Record;

public class MatiereBL {
	
	private Matiere m = null;
	ArrayList<String> listeErreurs = null;
	

	public MatiereBL(int matId) {
		m = (Matiere) Matiere.all().get(matId);
	}

	public MatiereBL() {}


	/**
	 * @return retourne si la demande d'ajout ou de modification est valide ou non
	 */
	public boolean estValidePourModif(String ancienNom)
	{	
		boolean identique = false;
		// Verification ajout d une matiere deja existante - coeff
		if (!ancienNom.equals(m.getNomMatiere())) {
			for (AbstractModel matiere : Matiere.all()) {
				Matiere matiereCourant = (Matiere)matiere;
				if (matiereCourant.getNomMatiere().equals(m.getNomMatiere()));
					identique = true;
			}
		}
		if (identique == true) {
			listeErreurs.add("Cette matiere existe deja.");
		}
		if (m.getCoeffDivise() < 0) {
			listeErreurs.add("Le coefficient doit etre positif.");
		}
		// S'il y a des erreurs, demande d'ajout non valide, sinon est valide
		if (listeErreurs.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}
	
	public boolean estValidePourAjout()
	{	
		boolean identique = false;
/*		// Verification ajout d une matiere deja existante - coeff
			for (AbstractModel matiere : Matiere.all()) {
				Matiere matiereCourant = (Matiere)matiere;
				if (matiereCourant.getNomMatiere().equals(m.getNomMatiere()));
					identique = true;
			}
		if (identique == true) {
			listeErreurs.add("Cette matiere existe deja.");
		}*/
		if (m.getCoeffDivise() < 0) {
			listeErreurs.add("Le coefficient doit etre positif.");
		}
		// S'il y a des erreurs, demande d'ajout non valide, sinon est valide
		if (listeErreurs.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * @return retourne si la demande de suppression est valide ou non
	 */
	public boolean estValidePourSuppr(){
		// S'il existe des SEE associes a la matiere a supprime, est pas valide
		ArrayList<Record> listeSEE = getListeSEE();
		if (!listeSEE.isEmpty()) {
			listeErreurs.add("SEE existants à cette matiere");
			return false;
		} else {
			return true;
		}
	}
	
	/**
	 * @param id : identifiant de la matière
	 * @param nom : nom de la matière
	 * @param desc : description de la matière
	 * @param coef : coefficient de la matière
	 * @param couleur : couleur de la matière (visible dans la consultation)
	 * @return la liste des erreurs
	 */
	public ArrayList<String> ajouterMatiere(int id, String nom, String desc, float coef, Color couleur, int idUE, DataSet dsSEE) {
		listeErreurs = new ArrayList<String>();
		m = new Matiere(id, nom, desc, coef, couleur, idUE, dsSEE);
		
		if (estValidePourAjout()) {
				m.save();
			}
		System.out.println(listeErreurs);
		return listeErreurs;
	}
	

	/**
	 * @param id : identifiant de la matière
	 * @param nom : nom de la matière
	 * @param desc : description de la matière
	 * @param coef : coefficient de la matière
	 * @param couleur : couleur de la matière (visible dans la consultation)
	 * @return la liste des erreurs
	 */
	public ArrayList<String> modifierMatiere(int id, String nom, String desc, float coef, Color couleur, int idUE, DataSet dsSEE, String ancienNom)
	{
		listeErreurs = new ArrayList<String>();
		m = new Matiere(id, nom, desc, coef, couleur, idUE, dsSEE);
		
		if (estValidePourModif(ancienNom)) {
			m.save(id);
		}
		System.out.println(listeErreurs);
		return listeErreurs;
	}
	

	/**
	 * @return la liste des erreurs
	 */
	public ArrayList<String> supprimerMatiere() {
		listeErreurs = new ArrayList<String>();
		
		if (estValidePourSuppr()) {
			m = new Matiere(this.getIdMatiere());
			m.delete();
		}
		return listeErreurs;
	}

	
	/* Ensemble des getters et setters -> delegation vers la persistance */
	
	public int getIdMatiere() {
		return m.getId();
	}

	public void setIdMatiere(int idMatiere) {
		m.setId(idMatiere);
	}

	public String getNomMatiere() {
		return m.getNomMatiere();
	}

	public void setNomMatiere(String nomMatiere) {
		m.setNomMatiere(nomMatiere);
	}

	public String getDescriptionMatiere() {
		return m.getDescriptionMatiere();
	}

	public void setDescriptionMatiere(String descriptionMatiere) {
		m.setDescriptionMatiere(descriptionMatiere);
	}

	public float getCoeffDivise() {
		return m.getCoeffDivise();
	}

	public void setCoeffDivise(float coeffDivise) {
		m.setCoeffDivise(coeffDivise);
	}

	public Color getCouleur() {
		return m.getCouleur();
	}

	public void setCouleur(Color couleur) {
		m.setCouleur(couleur);
	}
	
	public ArrayList<Record> getListeSEE()
	{
		ArrayList<Record> listeSEE = new ArrayList<Record>();
		for (AbstractModel s : m.getSee())
		{
			SEE seeCourant = (SEE)s;
			int seeId = seeCourant.getId();
			String seeNom = "SEE " + seeCourant.getId(); // TODO SEE n'a aucun nom
			listeSEE.add(new Record(seeId, seeNom));
		}
		return listeSEE;
	}
	
	
}
